package it.unisa.unibox.gestioneAutenticazione;

import it.unisa.unibox.Storage.DBAutenticazione;
import it.unisa.unibox.beans.Account;
import it.unisa.unibox.beans.Amministratore;
import it.unisa.unibox.beans.ResponsabileValutazione;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.commons.DBConstants;
import it.unisa.unibox.facade.FacadeAutenticazione;
import it.unisa.unibox.facade.IFacadeAutenticazione;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	public static ServletContext servletContext;
	public static IFacadeAutenticazione facade;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		try {
			super.init(config);			
			servletContext = getServletConfig().getServletContext();
			facade = new FacadeAutenticazione();
		} 
		
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");

		try{
		
			String username = request.getParameter("username");
			String password = request.getParameter("password");

			//if(username.equals("")){ username = "pippoP"; password = "pippos"; }
			
			System.out.println("us " +username+" "+password);

			if(!controllaCredenziali(username, password)){
				
				rd = request.getRequestDispatcher("/index.jsp?login=failed");
				request.setAttribute("error","");
			}
			else {
				Account account =  (Account) facade.login(username, password);
				
				if(account!=null){
					request.getSession().setAttribute("account",account);

					switch(account.getTipologia()){

					case DBConstants.ACCOUNT_TIPO_RICERCATORE :
						Ricercatore ricercatore=DBAutenticazione.getInstance().retrieveRicercatore(account);
						rd = request.getRequestDispatcher("/home.jsp");
						request.getSession().setAttribute("ricercatore", ricercatore);
						//out.println(ricercatore.toString());
						break;
						
					case DBConstants.ACCOUNT_TIPO_DIRETTORE :
						Ricercatore direttore=DBAutenticazione.getInstance().retrieveRicercatore(account);
						rd = request.getRequestDispatcher("/home.jsp");
						request.getSession().setAttribute("ricercatore", direttore);
						//out.println(direttore.toString());
						break;
						
					case DBConstants.ACCOUNT_TIPO_MEMBROAREA :
						Ricercatore membro=DBAutenticazione.getInstance().retrieveRicercatore(account);
						rd = request.getRequestDispatcher("/home.jsp");
						request.getSession().setAttribute("ricercatore", membro);
						//out.println(membro.toString());	
						break;
						
					case DBConstants.ACCOUNT_TIPO_RESPONSABILE :
						ResponsabileValutazione responsabile = DBAutenticazione.getInstance().retrieveResponsabileValutazione(account);
						rd = request.getRequestDispatcher("/home.jsp");
						request.getSession().setAttribute("responsabile", responsabile);
						//out.println(resp.toString());
						break;
						
					case DBConstants.ACCOUNT_TIPO_AMMINISTRATORE :
						Amministratore admin= DBAutenticazione.getInstance().retrieveAmministratore(account);
						rd = request.getRequestDispatcher("/home.jsp");
						request.getSession().setAttribute("admin", admin);
						//out.println(admin.toString());
						break;
						
					}
				}
				else
					rd = request.getRequestDispatcher("/index.jsp?login=failed");
					request.setAttribute("error","");
					
			}
			
			rd.forward(request, response);
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	private static boolean controllaCredenziali(String username, String password){
		if(username.length() < 6 || username.length() > 12 
				|| password.length() < 6 || password.length() > 12)
			return false;
		
		return true;
	}

}
